Rust一面

18 人赞同了该文章

实际讲解你做过的项目,和代码进行分析

我选择讲解以下的 MiniTokio

use futures::task;
use std::collections::VecDeque;
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
use std::time::{Duration, Instant};

struct Delay {
    when: Instant,
}
impl Future for Delay {
    type Output = &'static str;
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<&'static str> {
        if Instant::now() >= self.when {
            println!("hello world");
            Poll::Ready("done")
        } else {
            cx.waker().wake_by_ref();
            Poll::Pending
        }
    }
}
struct MiniTokio {
    tasks: VecDeque<Task>,
}

//允许将任何实现了 Future Trait 的具体类型(如 async { ... } 块或 Delay)放入同一个队列中
type Task = Pin<Box<dyn Future<Output = ()> + Send>>;

impl MiniTokio {
    fn new() -> MiniTokio {
        MiniTokio {
            tasks: VecDeque::new(),
        }
    }

    /// 生成一个 Future并放入 mini-tokio 实例的任务队列中
    fn spawn<F>(&mut self, future: F)
    where
        F: Future<Output = ()> + Send + 'static,
        //Future<Output = ()>: 必须是一个返回 () 的 Future.
    {
        self.tasks.push_backpin(future);
    }

    fn run(&mut self) {
        let waker = task::noop_waker();
        let mut cx = Context::from_waker(&waker);

        //取出任务
        while let Some(mut task) = self.tasks.pop_front() {
            //轮询任务 如果没有完成 把它从后面放回队列
            if task.as_mut().poll(&mut cx).is_pending() {
                self.tasks.push_back(task);
            }
        }
    }
}

fn main() {
    let mut mini_tokio = MiniTokio::new();

    mini_tokio.spawn(async {
        let when = Instant::now() + Duration::from_millis(10);
        let future = Delay { when };

        let out = future.await;
        assert_eq!(out, "done");
    });

    mini_tokio.run();
}

问题

  1. 讲解这段代码的功能然后逐个讲解每一个部分的实现
  2. 这里怎么体现 异步 的基本原理?
  3. impldyn 是什么,区别是什么
  4. 已经有了 Box 这里为什么要使用 Pin
  5. 回答不上来的问题:为什么rust选择了async/await 不是 epoll,io_uring

发布于 2025-09-27 22:00・湖南阿里千问AI,办公提效小助手

[

基于Qwen大模型,千问PC端适配多场景,支持文档处理、翻译、PPT生成等。多窗口同步操作,智能升级无门槛,工...

](https://www.qianwen.com/?ch=webtongyi@gp_zhztzhihugpwebty01_normal2_35&cb=https%3A%2F%2Fsugar.zhihu.com%2Fplutus_adreaper_callback%3Fsi%3Dfb89423e-81f0-43d0-9132-ab8b0dacab8c%26os%3D3%26zid%3D1629%26zaid%3D3737692%26zcid%3D3725443%26cid%3D3725443%26event%3D__EVENTTYPE__%26value%3D__EVENTVALUE__%26ts%3D__TIMESTAMP__%26cts%3D__TS__%26mh%3D245b8a85fbdc6d02d10778e960fa3d33%26adv%3D755269%26ocg%3D1%26cp%3D1500%26ocs%3D1%26aic%3D0%26atp%3D0%26ct%3D2%26ed%3DGiBNJgVzfCMmUW9XFyEvRA8xBGxJICwkOhh0FlwxKw1fY0gnWzUoISkYY0FAPSBRDHgLbEkuNjNzFXQSRDkoDVpyD3kLe2N4fhdgXwRmegZNKlcvUSdncGhJJ1oAYHQFWnEAeApSwxMiVsbkcw%3D%3D&ua=Mozilla%2F5.0+(Windows+NT+10.0%3B+Win64%3B+x64)+AppleWebKit%2F537.36+(KHTML%2C+like+Gecko)+Chrome%2F148.0.0.0+Safari%2F537.36&os=3&campaignId=2736418&adgroupId=3737692&creativeId=3725443&accountId=755269&ip=125.114.123.233&ipv6=125.114.123.233&from=zhihu&spu=biz%3D0%26ci%3D3725443%26si%3Dba73607b-d154-4123-932d-5227c4e26a17%26ts%3D1779451669%26zid%3D1629)